package 第七章构造方法;

/*
 *   面向对象的三大特征
 *       封装
 *       继承
 *       多态
 * 为什么要封装，封装的好处是什么
 *   封装的好处：
 *       1、封装之后，看不到该事物复杂的一面，只能看到简单的一面
 *          复杂性封装，对外界提供简单的操作入口。
 *       2、封装之后才会生存真正的"对象"，真正的独立体。
 *       3、封装意味着以后的程序可以重复使用，并且这个事物适应性比较强，在任何场合都可以使用。
 *       4、封装之后对于事物的安全性比较高。
 *
 * 封装的步骤
 *      1、所有属性私有化，使用private关键字进行修饰，修饰的数据只能在本类中访问
 *      2、对外提供简单的操作入口，也就是说以后外部程序想要访问age属性，必须通过这些入口进行访问
 *          对外提供两个公开的方法，分别是set和set方法，分别对于修改和读取数据
 *
 * 对一个属性访问的常见操作
 *      1、读取属性的值    get
 *      2、修改属性的值    set
 *      3、
 *
 *
 * */
public class UserTest {
    public static void main(String[] args) {


        User user = new User();
        UserPrivate userPrivate = new UserPrivate();


        //userPrivate.age中age类是private类型，不可见
        //age私有化之后，在外部程序中不能直接访问
        //对于目前程序来说，age彻底无法访问
        // System.out.println(userPrivate.age);


        // 有static关键字修饰的方法调用方式   类名.方法名（实参）
        // 没有static关键字修饰的方法调用方式   引用.方法名（实参）
        //setter
        System.out.println("请输入年龄：");
        java.util.Scanner setage = new java.util.Scanner(System.in);
        int age = setage.nextInt();
        userPrivate.setAge(age);
        //getter
        System.out.println(userPrivate.getAge());

        System.out.println("**************************************");
        System.out.println(user.age);
        user.age = 20;
        System.out.println(user.age);

        //这里的age属性显然是完全暴露给外部的，对于程序员来说，可以操作user类中所有的数据，导致User中的数据不安全
        //不建议这样，建议User类进行封装，建议在外部程序中不能随意访问User中的数据
        user.age = -100;
        System.out.println(user.age);
        user.age = 30;
        System.out.println(user.age);

    }


}
